﻿#include "KItemGenerator.h"
#include "Tools.h"
#include "MarketDataStream.h"
#include "CTPTime.h"
#ifdef __linux__
#include <cstring>
#endif

KGen::KItemGenerator::KItemGenerator()
{
	m_kItemStartTime = 0;
	m_kItemEndTime = 0;
}

//void KGen::KItemGenerator::InitItem(const std::string &pSymbolName, KItemCallBack *pcallBack)
//{
//	m_kitemCallback = pcallBack;
//	m_symbolName = pSymbolName;
//	//m_genKItemCallback = pCallback;
//	// 读取上一根位保存的K线
//	// 读取上一根保存的K线
//}

void KGen::KItemGenerator::PushNewPrice(const MData::PriceItem &pItem, MData::KLineItem &lastKItem)
{
	memset(&lastKItem, 0, sizeof(MData::KLineItem));

	if (m_kItemStartTime <= 0) // 第一次初始化
	{
		getKItemRange(pItem.UpdateTime, m_kItemStartTime, m_kItemEndTime);
		initKItem(pItem);
		return;
	}
	if (pItem.UpdateTime < m_kItemStartTime) // 这个行情一定是错的
	{
		return;
	}
	if (pItem.UpdateTime > m_kItemEndTime) // 输出上一根K线，同时初始化新K线
	{
		lastKItem = m_kItem;
		getKItemRange(pItem.UpdateTime, m_kItemStartTime, m_kItemEndTime);
		initKItem(pItem);
		return;
	}

	m_kItem.High = std::max(m_kItem.High, pItem.LastPrice);
	if (m_kItem.Low > 1e-6)
	{
		m_kItem.Low = std::min(m_kItem.Low, pItem.LastPrice);
	}
	else
	{
		m_kItem.Low = pItem.LastPrice;
	}
	m_kItem.Close = pItem.LastPrice;
	m_kItem.CloseTime = pItem.UpdateTime;
	m_kItem.CloseVolume = pItem.Volume;
}

void KGen::KItemGenerator::ClearKItem()
{
	m_kItemStartTime = 0;
	m_kItemEndTime = 0;
	memset(&m_kItem, 0, sizeof(MData::KLineItem));
}

//
//inline void KGen::KItemGenerator::updateLastSaveKItem(const time_t &pMarketTime, MData::KLineItem &ioKItem)
//{
//	if (m_kitemCallback != nullptr)
//	{
//		m_kitemCallback->UpdateKItem(m_symbolName, pMarketTime, m_kItem);
//	}
//}
//
//inline void KGen::KItemGenerator::saveLastKItem(const MData::KLineItem &pKItem)
//{
//	if (m_kitemCallback != nullptr)
//	{
//		m_kitemCallback->SaveKItem(m_symbolName, pKItem);
//	}
//}
//
//inline void KGen::KItemGenerator::updateTmpKItem(const MData::KLineItem &pKItem)
//{
//	if (m_kitemCallback != nullptr)
//	{
//		m_kitemCallback->SaveTmpKItem(m_symbolName, m_kItem);
//	}
//}

void KGen::KItemGenerator::initKItem(const MData::PriceItem &pItem)
{
	m_kItem.Open = pItem.LastPrice;
	m_kItem.High = pItem.LastPrice;
	m_kItem.Low = pItem.LastPrice;
	m_kItem.CloseTime = m_kItem.UpdateTime = pItem.UpdateTime;
	m_kItem.UpdateMillisec = pItem.UpdateMillisec;
	m_kItem.Close = pItem.LastPrice;
	m_kItem.CloseVolume = pItem.Volume;
}

void KGen::KItemGenerator::getKItemRange(time_t pUpdateTime, time_t &outKItemBegin, time_t &outKItemEnd)
{
	tm pDataTime = Tools::GetDateTimeFrmStamp(pUpdateTime);

	pDataTime.tm_sec = 0;
	outKItemBegin = Tools::GetTimeStamp(pDataTime);

	pDataTime.tm_sec = 59;
	outKItemEnd = Tools::GetTimeStamp(pDataTime);
}
//
//KGen::KItemCallBack::KItemCallBack()
//{
//	//SetWorkSpace(Tools::GetWorkSpace());
//}
//
//void KGen::KItemCallBack::UpdateKItem(const std::string &pSymbol, const time_t &pMarketTime, MData::KLineItem &ioKItem)
//{
//	// K线合并到上一根K线中
//	m_kItemStream.UpdateLastKItem(pSymbol, ioKItem);
//	//m_kItem.Index = lastTempKItem.Index;
//	tm marketTM = Tools::GetDateTimeFrmStamp(pMarketTime);
//	m_kItemStream.GetLastKItem(pSymbol, marketTM, ioKItem);
//}
//
//void KGen::KItemCallBack::SaveKItem(const std::string &pSymbol, const MData::KLineItem &pKItem)
//{
//	m_kItemStream.AppendKItem(pSymbol, pKItem);
//}
//
//void KGen::KItemCallBack::SaveTmpKItem(const std::string &pSymbol, const MData::KLineItem &pKItem)
//{
//	m_tmpKStream.UpdateKItem(pSymbol, pKItem);
//}
